package com.ssm.util.test.poi.model;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 *  poi读取模板并修改模板内容，基本操作代码都有展示。包括：
    1.读取excel
    2.创建sheet,给sheet命名
    3.获取指定的表格并替换其中的内容
    4.创建新的行或者列，并给cell赋值
    5.关于复杂表格中间出现循环的处理。
    6.样式的处理。
    7.当存在循环行的时候最后处理循环数据，使用插入行方法，其他行会自动下移，减少计算处理。(见代码时间处理的两种方式)
	poi处理表格比较灵活，同时比较繁琐，使用这样的方式后期维护量大，开发成本高，目前很多报表软件，可以视实际情况选择。
 * @author Administrator
 *
 */
public class excelUtil {
	
	public static void main(String[] args) throws Exception{
			FileInputStream fis = new FileInputStream("C:/Users/Administrator/Desktop/test1.xlsx");
			XSSFWorkbook workBook = new XSSFWorkbook(fis);
			String fileName = "test" + System.currentTimeMillis() + ".xlsx";
			OutputStream out = new FileOutputStream("C:/Users/Administrator/Desktop/tempFile" + "/" + fileName);
			// XSSFCellStyle style = CellStyle.getStyle(workBook);
			XSSFSheet sheet = workBook.cloneSheet(0); // 进行模板的克隆
			workBook.setSheetName(0, "sheet0"); // 给sheet命名
			// XSSFRow row = sheet.createRow(2); //创建行
			// XSSFCell cell = row.createCell(2); //创建列
			// row2.createCell(0).setCellValue("你好吗"); //-创建新的cell，不会为null
			// sheet.getRow(0).getCell(0).setCellValue("我爱你"); //替换 取不到值为报null

			// 创建新的cell和样式
			// XSSFCell nameCell = sheet.createRow(0).createCell(1);
			// XSSFCellStyle style = workBook.createCellStyle();
			// XSSFFont font = workBook.createFont();
			// font.setColor(HSSFColor.GREEN.index);
			// style.setFont(font);
			// nameCell.setCellStyle(style);
			// nameCell.setCellValue("尹江桥");

			// 替换之前的内容
			XSSFCell nameCell = sheet.getRow(0).getCell(1);
			nameCell.setCellValue("尹江桥");
			XSSFCell ageCell = sheet.getRow(0).getCell(3);
			ageCell.setCellValue("24");
			XSSFCell placeCell = sheet.getRow(0).getCell(5);
			placeCell.setCellValue("湖北");
			XSSFCell skillsCell = sheet.getRow(2).getCell(1);
			skillsCell.setCellValue("java,php,python");

			List<Map> list = new ArrayList<Map>();
			Map<String, String> m1 = new HashMap<String, String>();
			Map<String, String> m2 = new HashMap<String, String>();
			Map<String, String> m3 = new HashMap<String, String>();
			m1.put("college", "长江大学");
			m2.put("college", "武汉大学");
			m3.put("college", "深圳大学");
			m1.put("time", "2015/12/12-2016/15/12");
			m2.put("time", "2016/12/12-2017/15/12");
			m3.put("time", "2016/12/12-2017/15/12");
			list.add(m1);
			list.add(m2);
			list.add(m3);

			// 循环之前赋值

			sheet.getRow(18).getCell(5).setCellValue("2017/12/15");
			sheet.shiftRows(17, 17 + list.size(), 1, true, false); // 第1个参数是指要开始插入的行，第2个参数是结尾行数
			for (int i = 0; i < list.size(); i++) {
				XSSFRow creRow = sheet.createRow(17 + i);
				creRow.setRowStyle(sheet.getRow(17).getRowStyle());
				creRow.createCell(0).setCellValue(list.get(i).get("college").toString());
				creRow.createCell(1).setCellValue(list.get(i).get("time").toString());
			}
			// 循环之后的赋值

			// sheet.getRow(17+list.size()).getCell(5).setCellValue("2017/12/15");

			workBook.removeSheetAt(0); // 移除workbook中的模板sheet
			workBook.write(out);
			fis.close();
			out.flush();
			out.close();
	}
}
